'use strict'

const { Controller } = require('egg')

class RoleController extends Controller {
  // 角色列表
  async getRoleList() {
    const { ctx, app } = this
    const roleList = await app.model.Role.findAll()
    ctx.apiSuccess(roleList)
  }
  // 添加角色
  async createRole() {
    const { ctx, app } = this
    // 参数验证
    ctx.validate({
      name: { type: 'string', required: true, desc: '角色名称' },
      perms: { type: 'string', required: true, desc: '权限id' }
    })
    let { name, perms } = ctx.request.body
    // 整理参数
    perms = perms.split(',').map((id) => parseInt(id))
    // 角色是否存在
    const role = await app.model.Role.findOne({
      where: { role_name: name }
    })
    if (role) return ctx.apiFailed('角色已存在')
    // 添加角色
    let newRole = await app.model.Role.create({ role_name: name })
    newRole = newRole.toJSON()
    // 添加权限
    await app.model.RolePermissions.bulkCreate(
      perms.map((id) => {
        return { rid: newRole.id, pid: id }
      })
    )
    ctx.apiSuccess('添加成功')
  }
  // 给用户分配角色
  async createUserRole() {
    const { ctx, app } = this
    // 参数验证
    ctx.validate({
      uid: { type: 'int', required: true, desc: '用户id' },
      rid: { type: 'string', required: true, desc: '角色id' }
    })
    let { uid, rid } = ctx.request.body
    // 整理参数
    rid = rid.split(',').map((id) => parseInt(id))
    //  删除已有的角色
    await app.model.UserRole.destroy({ where: { uid } })
    // 添加新的角色
    await app.model.UserRole.bulkCreate(
      rid.map((id) => {
        return { uid, rid: id }
      })
    )
    ctx.apiSuccess('分配角色成功')
  }
  // 编辑角色
  async updateRole() {
    const { ctx, app } = this
    // 参数验证
    ctx.validate({
      name: { type: 'string', required: true, desc: '角色名称' },
      rid: { type: 'int', required: true, desc: '角色id' },
      pid: { type: 'string', required: true, desc: '权限id' }
    })
    let { name, rid, pid } = ctx.request.body
    // 整理参数
    pid = pid.split(',').map((id) => parseInt(id))
    // 更新角色名称
    app.model.Role.update({ role_name: name }, { where: { id: rid } })
    // 删除已有的角色权限
    await app.model.RolePermissions.destroy({ where: { rid } })
    // 添加新的角色权限
    await app.model.RolePermissions.bulkCreate(
      pid.map((id) => {
        return { rid, pid: id }
      })
    )
    ctx.apiSuccess('分配权限成功')
  }
  // 获取用户对应的角色
  async getUserRole() {
    const { ctx, service } = this
    // 参数验证
    ctx.validate({
      id: { type: 'int', required: true, desc: '用户id' }
    })
    const { id } = ctx.request.query
    const role = await service.adminUser.getRole(id)
    if (role.length > 0) {
      const roles = role[0].roles
      return ctx.apiSuccess(roles)
    }
    ctx.apiSuccess(role)
  }
  // 删除角色
  async deleteRole() {
    const { ctx, app } = this
    // 参数验证
    ctx.validate({
      id: { type: 'int', required: true, desc: '角色id' }
    })
    let { id } = ctx.request.body
    // 删除角色
    const result = await app.model.Role.destroy({ where: { id } })
    // 删除角色对应的权限
    app.model.RolePermissions.destroy({ where: { rid: id } })
    // 删除用户对应的角色
    app.model.UserRole.destroy({ where: { rid: id } })

    ctx.apiSuccess(result)
  }
}

module.exports = RoleController
